本文转载自:历时七天,史上最强MySQL优化总结,从此优化So Easy!
一、概述
1. 为什么要优化
- 一个应用吞吐量瓶颈往往出现在数据库的处理速度上
- 随着应用程序的使用,数据库数据逐渐增多,数据库处理压力逐渐增大
- 关系型数据库的数据是存放在磁盘上的,读写速度较慢(与内存中的数据相比)
2. 如何优化
- 表、字段的设计阶段,考量更优的存储和计算
- 数据库自身提供的优化功能,如索引
- 横向扩展,主从复制、读写分离、负载均衡和高可用
- 典型SQL语句优化(收效甚微)
二、字段设计
1. 典型方案
①. 对精度有要求
- decimal
- 小数转整数
②. 尽量使用整数表示字符串(IP)
inet_ aton("ip' )
inet_ ntoa(num)
③. 尽可能使用not null
- nuI数值的计算逻辑比较复杂
④. 定长和非定长的选择
- 较长的数字数据可以使用decimal
- char为定长(超过长度的内容将被截掉), varchar为非定长,text对内容 长度的保存额外保存而varchar对长度的保存占用数据空间
⑤. 字段数不要过多字段注释是必要的、字段命名见名思意、可以预留字段以备扩展
2. 范式
①. 第一范式:段原子性(关系型数据库有列的念,默认就符合了)
②. 第二范式:消除对主键的部分依赖(因为主键可能不止一个);使用一 个与业务无关的字段作为主键
③. 第三范式:消除对主键的传递依赖;高内聚, 如商品表可分为商品简略信息表和商品详情表两张表
三、存储引擎的选择(MyISAM和Innodb)
1. 功能差异
Innodb支持事务、 行级锁定、外健
2. 存储差异
①. 存储方式:MyISAM的数据和索弓 |是分开存储的(.MYI.MYD) , 而Innodb是存在一起的(.frm)
②. 表可移动性:可以通过移动表对应的MYI和MYD能够实现表的移动,而Innodb还有 额外的关联文件
③. 碎片空间:MyISAM删除数据时会产生碎片空间(占用表文件空间),需要定期通过optimizetable table-name手动优化。而Innodb不会。
④. 有序存储:Innodb插入数据时按照主键有序来插入。因此表中数据